package com.yang.smsgateway.task;

import com.yang.common.constant.CacheConstant;
import com.yang.common.constant.RabbitMQConstants;
import com.yang.common.constant.SmsConstant;
import com.yang.common.model.StandardReport;
import com.yang.common.model.StandardSubmit;
import com.yang.common.util.CMPPDeliverMapUtil;
import com.yang.common.util.CMPPSubmitRepoMapUtil;
import com.yang.smsgateway.client.BeaconCacheClient;
import com.yang.smsgateway.enums.CMPP2DeliverEnums;
import com.yang.smsgateway.enums.CMPP2ResultEnums;
import com.yang.smsgateway.netty4.entity.CmppSubmitResp;
import com.yang.smsgateway.util.SpringUtil;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeanUtils;


//不需要注入到IOC容器中，这是一个任务类，哪里需要执行任务，哪里就创建对象就行了
//如果注入到IOC容器中，就会变成单例模式
//即使用到IOC容器中，也可以通过SpringUtil从IOC容器中获取
public class DeliverRunnable implements Runnable {

    private RabbitTemplate rabbitTemplate = SpringUtil.getBeanByClass(RabbitTemplate.class);
    private BeaconCacheClient cacheClient = SpringUtil.getBeanByClass(BeaconCacheClient.class);

    private long msgId;

    private String stat;

    //通过 成员变量 + 有参构造方法 将需要的参数传进来
    public DeliverRunnable(long msgId, String stat) {
        this.msgId = msgId;
        this.stat = stat;
    }

    @Override
    public void run() {
        System.out.println("DeliverRunnable当前线程" + Thread.currentThread().getName());
        //1、基于msgId拿到临时存储的Report对象(即第一次发送搜索模块的对象)
        StandardReport report = CMPPDeliverMapUtil.remove(msgId);

        //2、确认当前短信发送的最终状态
        if (StringUtils.isNotBlank(stat) && "DELIVRD".equals(stat)){
            // 短信发送成功
            report.setReportState(SmsConstant.REPORT_SUCCESS);
        }else {
            //短信发送失败
            report.setReportState(SmsConstant.REPORT_FAIL);
            report.setErrorMsg(CMPP2DeliverEnums.getDescription(stat));
        }

        //3、客户状态报告推送，让网关模块查询缓存，当前客户是否需要状态报告推送(和策略模块中的sendPushReport方法一样，都是向用户推送状态报告)
        //查询当前客户的isCallback
        Integer isCallback = cacheClient.hgetInteger(CacheConstant.CLIENT_BUSINESS + report.getApikey(), "isCallback");
        // 查看是否需要给客户一个回调
        if (1 == isCallback){
            //如果需要回调，查询客户的回调地址
            String callbackUrl = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + report.getApikey(), "callbackUrl");
            //如果回调地址不为空，开始封装StandardReport
            if (StringUtils.isNotBlank(callbackUrl)){
                // 封装客户的报告推送的信息，开始封装StandardReport
                report.setIsCallback(isCallback);
                report.setCallbackUrl(callbackUrl);
                // 发送消息到RabbitMQ
                rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_PUSH_REPORT,report);
            }
        }

        //4、发送消息，让搜索模块对之前写入的信息做修改，这里需要做一个死信队列，延迟10s发送修改es信息的消息（确保修改在新增之后）
        // 声明好具体的交换机和队列后，直接发送report到普通队列，10s后放到死信队列
        rabbitTemplate.convertAndSend(RabbitMQConstants.SMS_GATEWAY_NORMAL_EXCHANGE,"",report);
    }
}
